#!/usr/bin/env python
#-*- coding:utf-8 -*-

# file:__init__.py.py
# author:ytytyt
# datetime:2021/6/26 18:08
# software: PyCharm
"""
this is functiondescription
"""
# import module your need
import logging
from logging.handlers import RotatingFileHandler
from flask import Flask,render_template ,request,redirect
from flask_session import Session
from flask_sqlalchemy import SQLAlchemy
from flask_bootstrap import Bootstrap
from config import config
from app.blueprints.todolistviews import todolist_bp   # 引入模块的蓝图
from app.blueprints.reader_regulatorviews import reader_regulator_bp  #引入图书管理的蓝图
# 数据库
from utils.commons import ReConverter

db = SQLAlchemy()
# 配置日志信息
# 设置日志的记录等级
"""
开发应用程序或部署开发环境时，可以使用 DEBUG 或 INFO 级别的日志获取尽可能详细的日志信息来进行开发或部署调试；
应用上线或部署生产环境时，应该使用 WARNING 或 ERROR 或 CRITICAL 级别的日志来降低机器的I/O压力和提高获取错误
日志信息的效率。配置文件为DEBUG时会默认设置级别为DEBUG
"""
logging.basicConfig(level=logging.DEBUG)

# 创建日志记录器，指明日志保存的路径，每个日志文件的最大大小，保存日志文件个数上限
file_log_handler = RotatingFileHandler("logs/logs", maxBytes=1024 * 1024 * 100, backupCount=10)

# 创建日志记录格式
formatter = logging.Formatter('%(asctime)s-%(levelname)s %(filename)s:%(lineno)d %(message)s')

# 为刚创建的日志记录器设置日志记录格式
file_log_handler.setFormatter(formatter)

# 为全局的日志工具对象(flask app使用的)添加日志记录器
logging.getLogger().addHandler(file_log_handler)

# 创建flask_uploads对象
"""
UploadSet第一个参数要和配置文件中的“UPLOADED_PHOTOS_DEST”中间的参数相同，第二个参数可以省略，在配置中添加ALLOW设置
"""
# images = UploadSet('images', extensions=('jpg', 'png', 'jpeg', 'svg', 'bmp', 'gif'))
# files = UploadSet('files', extensions=('txt', 'doc', 'docx', 'pdf', 'avi', 'zip', 'rar', 'mp4'))

# 工厂模式创建app应用对象-可以增加启动参数
def create_app():
    """
    创建flask的应用对象
    :param config_name: string 配置模式的名字  （"develop", "product"）
    :return:
    """
    # 创建Flask应用对象，创建时，定义好模板文件的文字，静态资源css以及图片的位置---防止在模板页面中找不到样式或者背景图
    app = Flask(__name__,template_folder='./templates',static_folder="./static")

    # 根据配置模式的名字获取配置参数的类
    app.config.from_object(config)

    # 使用app初始化db
    db.init_app(app)

    # 利用Flask_session将数据保存的session中
    Session(app)

    # 给应用添加Bootstrap支持
    Bootstrap(app)

    #测试路由
    @app.route('/index')
    def index():
        return "this is a index page"

    # 为flask补充csrf防护
    # CSRFProtect(app)

    # 为flask-uploads注册app
    # 将 app 的 config 配置注册到 UploadSet 实例 images,同时初始化
    # configure_uploads(app, (images, files))

    # 为flask添加自定义得转换器(放在注册蓝图之前)
    app.url_map.converters["re"] = ReConverter

    # web页面路由引入，通过注册每个模块的蓝图
    app.register_blueprint(todolist_bp)
    app.register_blueprint(reader_regulator_bp)

    '''
      整个接口应用的蓝图(接口分模块定义)加载和注册
    '''
    # web接口路由蓝图
    # postman测试地址：http://127.0.0.1:5000/api/todolists
    # from api.toDoListResource import toDoList_blueprint
    # app.register_blueprint(toDoList_blueprint, url_prefix="/api")

    return app
